# 给定一个带有头结点 head 的非空单链表，返回链表的中间结点。
# 如果有两个中间结点，则返回第二个中间结点。
#
#
# 输入：[1,2,3,4,5]
# 输出：此列表中的结点 3 (序列化形式：[3,4,5])
# 返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。
# 注意，我们返回了一个 ListNode 类型的对象 ans，这样：
# ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.
#
# 输入：[1,2,3,4,5,6]
# 输出：此列表中的结点 4 (序列化形式：[4,5,6])
# 由于该列表有两个中间结点，值分别为 3 和 4，我们返回第二个结点。
#  
# 给定链表的结点数介于 1 和 100 之间。
#
# 链接：https://leetcode-cn.com/problems/middle-of-the-linked-list


# 执行用时 : 32 ms 击败了 75.29% 的用户
# 内存消耗 : 13.4 MB 击败了 5.55% 的用户

# 反正一到链表我就连题目都看不懂...
# 然后一开始是想用list做的,写到一半突然想起来我从没用过的字典!
# 想赶快试试然后脑补语法未遂... 原来字典增加元素写法和list不一样啊_(:з」∠)_
# 复习语法时看到以前的笔记 说字典加入移除较快,是牺牲内存换时间的类型
# 从运行结果来看...嘛,虽然时间也没有很理想把,但内存是真的惨...

class Solution:
    def middleNode(self, head):
        hashDict = {}
        count = 0
        while not head.next == None:
            hashDict[count] = head.next
            head = head.next
            count += 1

        if count == 0:
            return head
        if not count % 2 == 0:
            return hashDict[count // 2]
        else:
            return hashDict[count // 2 - 1]

